# include "business/project/project.h"
# include "business/data/students.h"
# include "business/data/uces.h"
# include "business/allocation/allocation.h"
# include "io/cmd/cmd.h"

static LinkedList * getCommands () {
	Command cmdL[] = {
		{ "saveProject", command_saveProject, "Guarda o projecto" },
		{ "loadProject", command_openProject, "Carrega um projecto" },
		{ "projectStatus", command_actualProject, "Mostra o estado do projecto actual" },
		{ "listProjects", command_listProjects, "Mostra os projectos existentes" },
		{ "newProject", command_newProject, "Inicia um projecto novo" },
		{ "listStudents", command_listStudents, "Lista os Alunos" },
		{ "addStudent", command_addStudent, "Adiciona um novo estudante" },
		{ "removeStudent", command_removeStudent, "Remove um estudante" },
		{ "studentsStatus", command_statusStudents, "Estatísticas sobre alunos" },
		{ "showStudent", command_showStudent, "Toda a informação de um aluno" },
		{ "listUCEs", command_listUCEs, "Listar as UCEs existentes" },
		{ "addUCE", command_addUCE, "Adicionar uma nova UCE" },
		{ "removeUCE", command_removeUCE, "Remover uma UCE" },
		{ "ucesStatus", command_statusUCE, "Estatísticas das UCEs" },
		{ "exit", command_exit, "Fechar o programa" },
		{ "quit", command_exit, "Sinónimo de exit" },
		{ "listConfigs", command_listConfigs, "Lista todas as configurações" },
		{ "showConfig", command_showConfig, "Mostra uma configuração em particular" },
		{ "setConfig", command_setConfig, "Altera ou cria uma configuração" },
		{ "allocStudents", command_allocateStudents, "Realiza os calculos" },
		{ "minHorariosMaxHappyness", command_minHorarioMaxHappyness, "Calcula o número minimo de horários para maximizar o número de primeiras escolhas" },
		{ "ocupacao", command_ocupacao, "Estatísticas" },
		{ "indiceForca", command_indiceForca, "Estatisticas" },
		{ "fraqueza", command_fraqueza, "Estatisticas" },
		{ "potencial", command_potencial, "Estatisticas" },
		{ "proximidade", command_proximidade, "Estatisticas" },
		{ NULL, NULL, NULL }
	};
	LinkedList *list = NULL;
	int i;
	for (i=0;cmdL[i].name;i++) 
		list = insertElemHead(list,
			newCommand(cmdL[i].name,cmdL[i].command,cmdL[i].description));
	return list;
}
int main (int argc, char *argv[]) {
	initializeCommandLine(getCommands()); // inicializa a linha de comandos
	initializeProjectSystem();
	promptUserCicle(); // ciclo de linha de comandos
}
